import {
  getUserInfo
} from '@api/modules/user'

import {
  getSideMenus
} from '@api/modules_pc/base'
import {
  setRole,
} from '@utils/role'
/**
 * 用户信息
 */
function setStorageUser(newData) {
  if (!newData)
    return
  const oldData = getStorageUser()
  console.log('【【【setStorageUser】】】', newData, oldData)
  if (oldData)
    newData = Object.assign(oldData, newData)
  if (!newData.biz_id)
    newData.biz_id = 0
  localStorage.setItem('userInfo', JSON.stringify(newData))
  localStorage.setItem('biz_id', newData.biz_id)
}

// WARN: 为什么有的地方直接取值，有的地方调用 getUserInfo ？？？

function getStorageUser() {
  if (!localStorage.userInfo)
    return
  return JSON.parse(localStorage.userInfo)
}

function getStorageUserByKey(key) {
  // NOTE: 只有在确定前面的流程已调用过 getUserData 方法的情况下才能使用
  if (!key)
    return
  const userInfo = getStorageUser()
  if (!userInfo)
    return ''
  return userInfo[key] || ''
}

function getUserData(needRefresh) {
  // NOTE: 登录成功后会立即调用。
  return new Promise((resolve, reject) => {
    let userInfo = getStorageUser()
    console.log('【【【getStorageUser】】】', userInfo)
    if (!(needRefresh === true) && userInfo) {
      resolve(userInfo)
    } else {
      getUserInfo().then(res => {
        console.log('【【【getUserInfo】】】', res.data)
        if (res.data) {
          userInfo = {
            ...res.data,
            // NOTE: 不允许修改数据结构。 不要单独提升 extra 中某些数据的层级
          }
          setStorageUser(userInfo)
          resolve(userInfo)
        } else {
          reject(res)
        }
      }).catch(reject)
    }
  })
}

/**
 * 微信 Openid
 */
function setStorageOpenid(openid) {
  localStorage.setItem('openid', openid || '')
}

function getStorageOpenid() {
  return localStorage.getItem('openid') || ''
}

/**
 * 登录
 */
function setSignIn(data = {}) {
  // token
  localStorage.setItem('access_token', data.access_token || '')
  // 用户角色
  setRole(data.role || '')
  // 记录登录账号，用于下次快速登录。退出后不需要清除缓存。
  localStorage.setItem('account', data.account || '')
}

function getSignInByKey(key) {
  if (key === 'access_token' || key === 'account')
    return localStorage.getItem(key) || ''
}

/**
 * 退出登录
 */
function setSignOut() {
  // 登录信息
  localStorage.removeItem('access_token')
  // 角色
  localStorage.removeItem('role')
  // 用户信息
  localStorage.removeItem('userInfo')
  localStorage.removeItem('biz_id')
  localStorage.removeItem('base_config')
  localStorage.removeItem('openid')

  // TODO: 切换用户理论上要清除侧边栏缓存
  unsetSessionSideMenus()
}

/**
 * 判断当前登录状态
 */
function isLogin() {
  return !!getSignInByKey('access_token')
}

/**
 * 获取缓存侧边
 */
function getSessionSideMenus() {
  const menus = sessionStorage.side_menus ? JSON.parse(sessionStorage.side_menus) : null,
        mark = sessionStorage.side_mark || '1'
  return {
    menus,
    mark
  }
}

/**
 * 存储侧边栏
 */
function setSessionSideMenus(mark, menus){
  sessionStorage.setItem('side_mark', mark)
  menus && sessionStorage.setItem('side_menus', JSON.stringify(menus))
}

/**
 * 存储侧边栏
 */
function unsetSessionSideMenus(mark, menus){
  sessionStorage.removeItem('side_menus')
  sessionStorage.removeItem('side_mark')
}

export {
  setStorageUser,
  getStorageUser,
  getStorageUserByKey,
  getUserData,

  setStorageOpenid,
  getStorageOpenid,

  setSignIn,
  getSignInByKey,
  setSignOut,
  isLogin,
  
  setSessionSideMenus,
  getSessionSideMenus,
  unsetSessionSideMenus
}